home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / dolmorph / src / imstore.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-15  |  35.4 KB  |  1,247 lines

  1. /*===========================================
  2.           DolphMorph(ドルフモーフ)
  3.  
  4.       モーフィング&変形アニメ作成ソフト
  5.  
  6.   モーフィングアルゴリズム: EAST 1994
  7.   インターフェース作成:     松内 良介 1994
  8. ===========================================*/
  9. #define    MODULE_IMSTORE
  10. /*
  11.     imstore.c
  12.     
  13.     静止画倉庫、動画倉庫の実現部
  14.  
  15.     static    SIMAGE    *SIMAGEnew(void)
  16.     static    void    SIMAGEdelete(SIMAGE *si)
  17.  
  18.             int        imstore_getFrameNum(void)
  19.             IMAGE    *imstore_getFrame(int idx)
  20.             int     imstore_getMarkNum(int side)
  21.             IMAGE    *imstore_getImage(int idx)
  22.  
  23.     static    void    AdjustImageStoreWin(int side)
  24.  
  25.             int        init_imstore(void)
  26.             void    end_imstore(void)
  27.  
  28.     static    void    calcImageListParm(STOREWIN *pw,
  29.                                       int *_xnum, int *_ylen, int *_ofsy,
  30.                                       int *_dispx, int *_dispy, int *_idx)
  31.     static    void    setSBarImageList(STOREWIN *pw, int bRedraw);
  32.     static    void    dispImageList(STOREWIN *pw)
  33.     static    void    dispImageList_onlyBack(STOREWIN *pw)
  34.     static    void    imstore_whichImage(int scrx, int scry, int *t, int *n,
  35.                                        FRAME *_fr)
  36.             int        imstore_storeNewImage(int n, IMAGE *pi, int idx)
  37.             void    imstore_deleteImage(int n, int idx)
  38.     static    void    makeErrorMessage(char *buf, char *fname, int error)
  39.     static    void    MOV_MAINHEAD_init(MOV_MAINHEAD *p)
  40.     static    void    V00_HEAD_init(V00_HEAD *p)
  41.     static    int        imstore_saveFrameStore_MOV(char *fname)
  42.             void    imstore_saveFrameStoreAsMovieFile(void)
  43.             int        imstore_checkSaveFrameStore(void);
  44.             void    imstore_saveFrameStore(void)
  45.             void    imstore_loadToStore(int side)
  46.             int     imstore_checkSaveMarkedImage(void)
  47.             void    imstore_saveMarkedImage(void)
  48.     static    void    imstore_WinUserMouseOn(int side, LIST *pli, EVENT *pev)
  49.  
  50.         ●部品の呼び出し関数
  51.             int        ImageStoreWinFunc(kobj, messId, argc, pev, trigger)
  52.             int        ImageStoreSBarFunc(kobj, messId, argc, pev, trigger)
  53.             int        ImageStoreEditDBtnFunc(kobj, messId, argc, pev, trigger)
  54. */
  55.  
  56. #include <stdio.h>
  57. #include <stdlib.h>
  58. #include <string.h>
  59. #include <winb.h>
  60. #include <te.h>
  61. #include <fntb.h>
  62. #include <gui.h>
  63. #include <file_dlg.h>
  64. #include <dos.h>
  65.  
  66. #include <egb.h>
  67. #include <wgb.h>
  68. #include <ryosuke.h>
  69. #include <usrlib.h>
  70.  
  71. #include "morph.h"
  72. #include "guisub.h"
  73. #include "fifo.h"
  74. #include "image.h"
  75. #include "wgbmac.h"
  76. #include "desktop.h"
  77. #include "points.h"
  78. #include "alert.h"
  79. #include "sub.h"
  80.  
  81. /*--------------------------------------------------------*/
  82. /*                        部品ID                        */
  83. /*--------------------------------------------------------*/
  84.  
  85.     int    idImageStoreWin[2] = -1 ;
  86.     int    idImageStoreTitleDBtn[2] = -1 ;
  87.     int    idImageStoreSBarV[2] = -1 ;
  88.     int    idImageStoreTitleMsg[2] = -1 ;
  89.     int    idImageStoreEditMenuDBtn[2] = -1 ;
  90.     int    idImageStoreEditDBtn[2][3] = -1 ;
  91.     int    idImageStoreEditMsg[2][3] = -1 ;
  92.  
  93. /*--------------------------------------------------------*/
  94. /*                    モジュール内変数                    */
  95. /*--------------------------------------------------------*/
  96.  
  97.   /* ウィンドウ上の各部品の配置情報 */
  98.     static    FRAME    frAdjTitleDBtn = {1,1,-2,16};
  99.     static    FRAME    frAdjSBarV = {-16,16,-1,-16};
  100.         #define    EMENUHT    17
  101.         #define    BTNW    34
  102.         #define    BTNSKIP    (BTNW+2)
  103.     static    FRAME    frAdjWinUser = {1,17,-17,-2-EMENUHT};
  104.     static    FRAME    frAdjEditMenuDBtn = {1,-2-(EMENUHT-1),-17,-2};
  105.     static    FRAME    frAdjEditDBtn[3] =
  106.         { { 4          , -2-(EMENUHT-2), 4+BTNW-1          , -3 },
  107.           { 4+BTNSKIP  , -2-(EMENUHT-2), 4+BTNW-1+BTNSKIP  , -3 },
  108.           { 4+BTNSKIP*2, -2-(EMENUHT-2), 4+BTNW-1+BTNSKIP*2, -3 } };
  109.  
  110.     typedef struct {
  111.         IMAGE    *piOriginal;
  112.         IMAGE    *piDisp;
  113.     } SIMAGE;
  114.  
  115.     #define    IMWIDTH            64
  116.     #define    IMHEIGHT        48
  117.     #define    IMXMARGIN        5
  118.     #define    IMYMARGIN        5
  119.     #define    IMXSKIP            8
  120.     #define    IMYSKIP            8
  121.     #define    IMNAMEHEIGHT    14
  122.     #define    IMXUNIT            (IMWIDTH + IMXSKIP)
  123.     #define    IMYUNIT            (IMHEIGHT+IMNAMEHEIGHT+IMYSKIP)
  124.  
  125.     typedef struct {
  126.         LIST    *plImage;
  127.         int        ofsY;            /* 画像リスト中の表示位置 */
  128.         int        nMarkedImage;
  129.         int        idWin;
  130.         int        idSBarV;
  131.     } STOREWIN;
  132.  
  133.     static STOREWIN    swin[2] =
  134.     {
  135.         { NULL, 0, -1 },
  136.         { NULL, 0, -1 }
  137.     };
  138.  
  139.     int    SIMAGELISTsetData(LIST *pl, SIMAGE **psi)
  140.         { return list_setData(pl, psi); }
  141.     int    SIMAGELISTinsertData(LIST *pl, SIMAGE **psi)
  142.         { return list_insertData(pl, psi); }
  143.     int    SIMAGELISTgetData(LIST *pl, SIMAGE **psi)
  144.         { return list_getData(pl,psi); }
  145.  
  146.     static    void    setSBarImageList();
  147.  
  148.   /* カット/ペースト処理用変数 */
  149.     IMAGE    *piPaste = NULL;
  150.  
  151. /*--------------------------------------------------------*/
  152. /*                     画像リスト要素                     */
  153. /*--------------------------------------------------------*/
  154.  
  155.     static    SIMAGE    *SIMAGEnew(void)
  156.     {
  157.         SIMAGE *si;
  158.         if ((si = TL_calloc(1,sizeof(SIMAGE))) == NULL)
  159.             return NULL;
  160.         if ((si->piDisp = image_new(IMWIDTH/2, IMHEIGHT/2)) == NULL)
  161.             { TL_free(si); return NULL; }
  162.         si->piOriginal = NULL;
  163.         return si;
  164.     }
  165.  
  166.     static    void    SIMAGEdelete(SIMAGE *si)
  167.     {
  168.         if (si->piDisp != NULL)
  169.             image_delete(si->piDisp);
  170.         if (si->piOriginal != NULL)
  171.             image_delete(si->piOriginal);
  172.         TL_free(si);
  173.     }
  174.  
  175. /*--------------------------------------------------------*/
  176. /*              外部のための動画倉庫アクセス              */
  177. /*--------------------------------------------------------*/
  178.  
  179.     int    imstore_getFrameNum(void)
  180.     {
  181.         return list_getDataNum(swin[1].plImage);
  182.     }
  183.  
  184.     IMAGE *imstore_getFrame(int idx)
  185.     {
  186.         SIMAGE *si;
  187.         if (0<=idx && idx < list_getDataNum(swin[1].plImage))
  188.         {
  189.             list_moveTo(swin[1].plImage, idx);
  190.             SIMAGELISTgetData(swin[1].plImage, &si);
  191.             return si->piOriginal;
  192.         }
  193.         return NULL;
  194.     }
  195.  
  196.     int imstore_getMarkNum(int side)
  197.     {
  198.         if (side == 0 || side == 1)
  199.             return swin[side].nMarkedImage;
  200.         else
  201.             return -1;
  202.     }
  203.  
  204.     IMAGE *imstore_getImage(int idx)
  205.     {
  206.         SIMAGE *si;
  207.         if (0<=idx && idx < list_getDataNum(swin[0].plImage))
  208.         {
  209.             list_moveTo(swin[0].plImage, idx);
  210.             SIMAGELISTgetData(swin[0].plImage, &si);
  211.             return si->piOriginal;
  212.         }
  213.         return NULL;
  214.     }
  215.  
  216. /*--------------------------------------------------------*/
  217. /*              ウィンドウ上の各部品の再配置              */
  218. /*--------------------------------------------------------*/
  219.  
  220.     static void AdjustImageStoreWin(int side)
  221.     {
  222.         RM_adjustFrame(idImageStoreTitleDBtn[side], idImageStoreWin[side],
  223.                        &frAdjTitleDBtn);
  224.         RM_adjustFrame(idImageStoreSBarV[side], idImageStoreWin[side],
  225.                        &frAdjSBarV);
  226.         RM_adjustFrame(idImageStoreEditMenuDBtn[side], idImageStoreWin[side],
  227.                        &frAdjEditMenuDBtn);
  228.         int i;
  229.         for (i=0; i<3; i++)
  230.         {
  231.             RM_adjustFrame(idImageStoreEditDBtn[side][i],idImageStoreWin[side],
  232.                            &frAdjEditDBtn[i]);
  233.             RM_adjustFrame(idImageStoreEditMsg[side][i],idImageStoreWin[side],
  234.                            &frAdjEditDBtn[i]);
  235.         }
  236.         RM_adjustWinUser(idImageStoreWin[side], &frAdjWinUser);
  237.     }
  238.     
  239. /*--------------------------------------------------------*/
  240. /*                モジュールの初期化/終了                */
  241. /*--------------------------------------------------------*/
  242.  
  243.     int init_imstore(void)
  244.     {
  245.         int i;
  246.         for (i=0; i<2; i++)
  247.         {
  248.             AdjustImageStoreWin(i);
  249.             swin[i].plImage = list_new(sizeof(SIMAGE*));
  250.             swin[i].idWin   = idImageStoreWin[i];
  251.             swin[i].idSBarV = idImageStoreSBarV[i];
  252.             setSBarImageList(&swin[i], FALSE);
  253.         }
  254.         return 0;
  255.     }
  256.  
  257.     void end_imstore(void)
  258.     {
  259.         list_destroy(swin[0].plImage);
  260.         list_destroy(swin[1].plImage);
  261.     }
  262.  
  263. /*--------------------------------------------------------*/
  264. /*            画像リストの各種パラメータの計算            */
  265. /*--------------------------------------------------------*/
  266.  
  267.     static void calcImageListParm(STOREWIN *pw,
  268.                                   int *_xnum, int *_ylen, int *_ofsy,
  269.                                   int *_dispx, int *_dispy, int *_idx)
  270.     {
  271.         FRAME fr;
  272.         RM_getWinUserFrame(pw->idWin, &fr);
  273.       /* 画像が横,縦にいくつ並ぶかを計算 */
  274.         int xnum,ynum; /* 画像が横,縦に並ぶ個数 */
  275.         xnum = (((fr.rdwx-fr.lupx+1)-IMXMARGIN*2)+IMXSKIP) / IMXUNIT;
  276.         ynum = ((list_getDataNum(pw->plImage) + 1)+(xnum-1)) / xnum;
  277.             // list_getDataNum + 1 としているのは、リスト末尾をマーク可能に
  278.             // するため。
  279.       /* 画像リストをすべて表示した場合の縦の長さを計算 */
  280.         int ylen;
  281.         ylen = ynum*(IMHEIGHT+IMNAMEHEIGHT) + _max(0,ynum-1)*IMYSKIP
  282.                + IMYMARGIN*2;
  283.       /* 他のパラメータの計算 */
  284.         int dispPosY;     /* ユーザー領域上端がリスト内のどの位置(y)か */
  285.         int startYCnt;     /* リストの何段目から表示するか? */
  286.         int dispx,dispy; /* ユーザー領域内座標での、表示開始座標 */
  287.         int idx;         /* 表示を始める画像の番号 */
  288.         dispPosY = RM_getScrollPos(pw->idSBarV) * 2;
  289.         startYCnt = _max(0, dispPosY-IMYMARGIN) / IMYUNIT;
  290.         dispx = fr.lupx + IMXMARGIN;
  291.         dispy = fr.lupy + IMYMARGIN + IMYUNIT * startYCnt - dispPosY;
  292.         idx = startYCnt * xnum;
  293.       /*  */
  294.         if (_xnum != NULL)
  295.             *_xnum = xnum;
  296.         if (_ylen != NULL)
  297.             *_ylen = ylen;
  298.         if (_ofsy != NULL)
  299.             *_ofsy = dispPosY;
  300.         if (_dispx != NULL)
  301.             *_dispx = dispx;
  302.         if (_dispy != NULL)
  303.             *_dispy = dispy;
  304.         if (_idx != NULL)
  305.             *_idx = idx;
  306.     }
  307.  
  308. /*--------------------------------------------------------*/
  309. /*                  スクロール範囲の設定                  */
  310. /*--------------------------------------------------------*/
  311.  
  312.     static void setSBarImageList(STOREWIN *pw, int bRedraw)
  313.     {
  314.         FRAME fr;
  315.         RM_getWinUserFrame(pw->idWin, &fr);
  316.         int xnum,ylen;
  317.         calcImageListParm(pw, &xnum, &ylen, &pw->ofsY,NULL,NULL,NULL);
  318.         RM_setScrollRange(pw->idSBarV,(fr.rdwy-fr.lupy+1)/2,ylen/2, bRedraw);
  319.     }
  320.  
  321. /*--------------------------------------------------------*/
  322. /*                    画像リストの表示                    */
  323. /*--------------------------------------------------------*/
  324.  
  325.     #define    DISP_NORMAL        0
  326.     #define    DISP_ONLYBACK    1
  327.  
  328.     static void _dispImageList_sub(STOREWIN *pw, int mode)
  329.     {
  330.         MG_mosDisp(2);
  331.         WINCLIP *pclStack;
  332.         RM_setOriginZero();
  333.         RM_setClipWinUser(pw->idWin, &pclStack);
  334.         FRAME fr;
  335.         RM_getWinUserFrame(pw->idWin, &fr);
  336.         if (mode == DISP_NORMAL)
  337.             WGB_BOXFILL(guiEgbPtr,fr.lupx,fr.lupy,fr.rdwx,fr.rdwy,WINBACK,0);
  338.         int xnum;
  339.         int dispx,dispy;    /* ユーザー領域内座標での、表示開始座標 */
  340.         int idx;            /* 表示を始める画像の番号 */
  341.         calcImageListParm(pw, &xnum,NULL,NULL,&dispx,&dispy,&idx);
  342.       /* 表示 */
  343.         int j;
  344.         for (;dispy<=fr.rdwy;dispy+=IMYUNIT)
  345.             for (j=0; j < xnum; j++,idx++)
  346.             {
  347.                 if (idx > list_getDataNum(pw->plImage))
  348.                     goto ENDDISP;
  349.                 if (idx < list_getDataNum(pw->plImage))
  350.                 {
  351.                     SIMAGE *si;
  352.                     list_moveTo(pw->plImage, idx);
  353.                     SIMAGELISTgetData(pw->plImage, &si);
  354.                     int wid,ht;
  355.                     image_getDispSize(si->piOriginal,
  356.                                       IMWIDTH,IMHEIGHT,&wid,&ht);
  357.                     int tx = dispx+IMXUNIT*j;
  358.                     image_disp(si->piDisp, tx,dispy,IMWIDTH,IMHEIGHT);
  359.                     if (mode == DISP_NORMAL)
  360.                     {
  361.                         if (idx == pw->nMarkedImage)
  362.                         {
  363.                             WGB_RBOXLINE(guiEgbPtr, tx-2,dispy-2,
  364.                                          wid+4,ht+4,BLACK,0);
  365.                             // WGB_RBOXLINE(guiEgbPtr,tx-1,dispy-1,
  366.                             //                wid+2,ht+2,BLACK,0);
  367.                         }
  368.                         char namebuf[30];
  369.                         sprintf(namebuf,"%d %dx%d",idx,
  370.                                 si->piOriginal->virwid,si->piOriginal->virht);
  371.                         RM_putstring12(guiEgbPtr, dispx+IMXUNIT*j,
  372.                                        dispy+IMHEIGHT+IMNAMEHEIGHT-12, namebuf,
  373.                                        BLACK, 0);
  374.                     }
  375.                 }
  376.                 else /* idx == list_getDataNum(pw->plImage) */
  377.                 {
  378.                     int tx = dispx+IMXUNIT*j;
  379.                     if (mode == DISP_NORMAL)
  380.                     {
  381.                         if (idx == pw->nMarkedImage)
  382.                         {
  383.                             WGB_RBOXLINE(guiEgbPtr,tx-2,dispy-2,
  384.                                          IMWIDTH+4,IMHEIGHT+4, BLACK,0);
  385.                             // WGB_RBOXLINE(guiEgbPtr,tx-1,dispy-1,
  386.                             //              IMWIDTH+2,IMHEIGHT+2, BLACK,0);
  387.                         }
  388.                     }
  389.                 }
  390.             }
  391.        ENDDISP:
  392.         RM_resetClipWinUser(pclStack);
  393.         RM_recoverOrigin();
  394.         MG_mosDisp(3);
  395.     }
  396.  
  397.     static void dispImageList(STOREWIN *pw)
  398.     {
  399.         _dispImageList_sub(pw, DISP_NORMAL);
  400.     }
  401.     
  402.     static void dispImageList_onlyBack(STOREWIN *pw)
  403.     {
  404.         _dispImageList_sub(pw, DISP_ONLYBACK);
  405.     }
  406.  
  407. /*--------------------------------------------------------*/
  408. /*          ある座標がどの画像に対応するか調べる          */
  409. /*--------------------------------------------------------*/
  410.  
  411.     static void imstore_whichImage(int scrx,int scry,int *t,int *n,FRAME *_fr)
  412.     /* 返値 t:0=静止画倉庫 1=動画倉庫 -1=どのウィンドウでもない */
  413.     /*      n:画像番号  (または 末尾番号 または -1)  */
  414.     /*      fr:その座標の画像の表示枠 */
  415.     {
  416.         int nWin,nImage;
  417.         STOREWIN *pw;
  418.       /* どのウィンドウ上にあるかをまず判断 */
  419.         EVENT ev;
  420.         ev.what = EVMOSDN;
  421.         ev.shift = SLEFTBTN;
  422.         ((POINT*)&ev.info)->x = scrx;
  423.         ((POINT*)&ev.info)->y = scry;
  424.         int id;
  425.         id = MMI_SendMessage(idDesktopSelectiveHyper, MM_ONPARTS, 1, &ev);
  426.         if (id == swin[0].idWin)
  427.             nWin = 0;
  428.         else if (id == swin[1].idWin)
  429.             nWin = 1;
  430.         else
  431.             goto NOWHERE;
  432.         pw = &swin[nWin];
  433.       /* 効率よく位置を調べるための各種パラメータを計算 */
  434.         FRAME fr;
  435.         RM_getWinUserFrame(pw->idWin, &fr);
  436.         int xnum;
  437.         int dispx,dispy; /* 表示開始座標(原点は画面左上) */
  438.         int idx;         /* 表示を始める画像の番号 */
  439.         calcImageListParm(pw, &xnum,NULL,NULL,&dispx,&dispy,&idx);
  440.       /* 位置を調べる */
  441.         if (scry < fr.lupy || fr.rdwy < scry)
  442.             goto NOWHERE;
  443.         int j;
  444.         for (; dispy<=fr.rdwy; dispy+=IMYUNIT)
  445.             for (j=0; j < xnum; j++,idx++)
  446.             {
  447.                 if (idx > list_getDataNum(pw->plImage))
  448.                     goto INUSER;
  449.                 int wid,ht;
  450.                 if (idx < list_getDataNum(pw->plImage))
  451.                 {
  452.                     SIMAGE *si;
  453.                     list_moveTo(pw->plImage, idx);
  454.                     SIMAGELISTgetData(pw->plImage, &si);
  455.                     image_getDispSize(si->piOriginal,
  456.                                       IMWIDTH,IMHEIGHT, &wid,&ht);
  457.                 }
  458.                 else  /* idx == list_getDataNum */
  459.                     wid = IMWIDTH, ht = IMHEIGHT;
  460.                 int tx = dispx + IMXUNIT * j;
  461.                 if (tx <= scrx && scrx < tx+wid &&
  462.                     dispy <= scry && scry < dispy+ht)
  463.                 {
  464.                     nImage = idx;
  465.                     if (_fr != NULL)
  466.                     {
  467.                         _fr->lupx = tx;       _fr->lupy = dispy;
  468.                         _fr->rdwx = tx+wid-1; _fr->rdwy = dispy+ht-1;
  469.                     }
  470.                     goto ENDSRCH;
  471.                 }
  472.             }
  473.        INUSER:;
  474.         *t = nWin;
  475.         *n = -1;
  476.         return;
  477.        NOWHERE:;
  478.         *t = -1;
  479.         *n = 0;
  480.         return;
  481.        ENDSRCH:;
  482.         *t = nWin;
  483.         *n = nImage;
  484.         return;
  485.     }
  486.  
  487. /*--------------------------------------------------------*/
  488. /*                 倉庫へ新たな画像を登録                 */
  489. /*--------------------------------------------------------*/
  490.  
  491.     int imstore_storeNewImage(int side, IMAGE *pi, int idx)
  492.     // side:0=静止画倉庫  1=動画倉庫
  493.     // idx: -1: マーク位置または終端に挿入、
  494.     //      >=0: その位置に挿入
  495.     {
  496.         static char alertTitle[] = "倉庫へ画像を登録";
  497.         STOREWIN *pw;
  498.         pw = &swin[side];
  499.         SIMAGE *si;
  500.         if ((si = SIMAGEnew()) == NULL)
  501.             return -1;    // ★警告表示は上位処理で行う
  502.         si->piOriginal = pi;
  503.         image_zoomdown(si->piDisp, si->piOriginal);
  504.       /* 適切な位置にリストポインタを移動 */
  505.         int datnum,inspos;
  506.         datnum = list_getDataNum(pw->plImage);
  507.         inspos = (idx < 0 ?
  508.                     (pw->nMarkedImage < 0 ? 
  509.                        datnum : _min(pw->nMarkedImage, datnum)) :
  510.                     _min(idx, datnum));
  511.         list_moveTo(pw->plImage, inspos);
  512.       /* 挿入 */
  513.         if (SIMAGELISTinsertData(pw->plImage, &si) != 0)
  514.             return -1;    // 警告表示は上位処理で行う
  515.         if (pw->nMarkedImage >= inspos)
  516.             pw->nMarkedImage++;
  517.       /* スクロールバー、ウィンドウの更新 */
  518.         setSBarImageList(pw, TRUE);
  519.         dispImageList(pw);
  520.         return 0;
  521.     }
  522.  
  523. /*--------------------------------------------------------*/
  524. /*                   倉庫から画像を削除                   */
  525. /*--------------------------------------------------------*/
  526.  
  527.     void imstore_deleteImage(int side, int idx)
  528.     {
  529.         STOREWIN *pw;
  530.         pw = &swin[side];
  531.         if (idx < 0 || list_getDataNum(pw->plImage) <= idx)
  532.             return;
  533.         SIMAGE *si;
  534.         list_moveTo(pw->plImage, idx);
  535.         SIMAGELISTgetData(pw->plImage, &si);
  536.         list_deleteData(pw->plImage);
  537.         SIMAGEdelete(si);
  538.         /*
  539.             if (pw->nMarkedImage == idx)
  540.                 pw->nMarkedImage = -1;
  541.             ↑こうするのとしないのと、どっちがいいのかなあ?
  542.         */
  543.         setSBarImageList(pw, TRUE);
  544.         dispImageList(pw);
  545.     }
  546.  
  547. /*--------------------------------------------------------*/
  548. /*          ファイル関係のエラーメッセージの作成          */
  549. /*--------------------------------------------------------*/
  550.  
  551.     static void makeErrorMessage(char *buf, char *fname, int error)
  552.     {
  553.         if (error == ERROR_CANNOTOPEN)
  554.             sprintf(buf, "ファイル %s がオープンできません", fname);
  555.         else if (error == ERROR_NOMEMORY)
  556.             sprintf(buf, "メモリの残り容量が不足しています");
  557.         else if (error == ERROR_DISKFULL)
  558.             sprintf(buf, "ディスクの残り容量が不足しています");
  559.         else if (error == ERROR_INVALIDFORMAT)
  560.             sprintf(buf, "画像ファイル形式が違います");
  561.         else if (error == ERROR_INVALIDPIXELSIZE)
  562.             sprintf(buf, "画像の色数が3万色ではありません");
  563.         else if (error != 0)
  564.             sprintf(buf, "処理を中断しました");
  565.         else
  566.             buf[0] = 0;
  567.     }
  568.  
  569. /*--------------------------------------------------------*/
  570. /*                    倉庫の画像の保存                    */
  571. /*--------------------------------------------------------*/
  572.  
  573.     typedef struct {
  574.         char    id[4];            // +  0 "MOV2"
  575.         int        pixelsize;        // +  4 bit/pixel ここでは16が入る
  576.         int        dataSize;        // +  8 total data size (本ヘッダは含まない)
  577.         int        frameNum;        // + 12 total frame
  578.         int        scrWidth;        // + 16 画面  横の長さ(320ドッド)
  579.         int        scrHeight;        // + 20 画面  縦の長さ(240ドット)
  580.         int        raster;            // + 24 raster 640が入る
  581.         int        wait;            // + 28 メインウエイト
  582.         short    dispx0;            // + 32 表示領域 x0
  583.         short    dispy0;            // + 34 表示領域 y0
  584.         short    dispx1;            // + 36 表示領域 x1
  585.         short    dispy1;            // + 38 表示領域 y1
  586.         char    fmb_file[8];    // + 40 FMBファイルネーム
  587.         char    fmb_ch[8];        // + 48 FMB ch割り当て(0~5ch) +2Byteの空き
  588.         char    pmb_file[8];    // + 56 PMB  ファイルネーム
  589.         char    pmb_ch[8];        // + 64 PMB  ch割り当て(64~71ch)
  590.         char    snd_name[8][8];    // + 72 SND  ch0~ch7  ファイルネーム
  591.         char    panpot[14];        // +136 ch0~5,ch64~71のパンポット(1Byte/ch)
  592.                                 // ( -64:左 ~ 00:中央 ~ 63:右 )
  593.         char    timingMode;        /* +150    タイミングモード ( ビット0がモード
  594.                                         識別になっており 0:ウエイトして表示
  595.                                         1:表示してウエイト) */
  596.         char    pudding[256-151];
  597.     } MOV_MAINHEAD;
  598.  
  599.     typedef struct {
  600.         int        page;        // + 0  ページ
  601.         int        dataSize;    // + 4  frame data size (本ヘッダは含まない)
  602.         char    pudding[4];    // + 8  リザーブ
  603.         short    wait;        // +12  wait
  604.         short    loop;        // +14  loop 情報 0:none 1~:start&回数 0xffff:end
  605.         char    sound[4][4];  // FMB & PMB データ0~2, データ3 / SNDデータ
  606.     } MOV_FRAMEHEAD;
  607.  
  608.     typedef struct {
  609.         char    id[4];        // +  0  "VD00"
  610.         int        dataSize;    // +  4  total data size (本ヘッダは含まない)
  611.         int        frameNum;    // +  8  total frame
  612.         unsigned int format; // + 12  データ形式番号(0x80008000が入る)
  613.         int        width;        // + 16  画面  横の長さ
  614.         int        height;        // + 20  画面  縦の長さ
  615.         int        wait;        // + 24  ウエイト(4~8)
  616.         char    pudding[256-28];
  617.     } V00_HEAD;
  618.  
  619.     static void MOV_MAINHEAD_init(MOV_MAINHEAD *p)
  620.     {
  621.         memset(p, 0, sizeof(MOV_MAINHEAD));
  622.         memcpy(p->id, "MOV2", 4);
  623.         p->pixelsize = 16;
  624.         p->scrWidth = 320;
  625.         p->scrHeight = 240;
  626.         p->raster = 640;
  627.     }
  628.     
  629.     static void V00_HEAD_init(V00_HEAD *p)
  630.     {
  631.         memset(p, 0, sizeof(V00_HEAD));
  632.         memcpy(p->id, "VD00", 4);
  633.         p->format = 0x80008000UL;
  634.         p->wait = 4;
  635.     }
  636.  
  637.     static int imstore_saveFrameStore_MOV(char *fname)
  638.     {
  639. #if 0
  640.         static char alertTitle[] = "MOV ファイルの作成";
  641.         FILE *fp;
  642.         int i;
  643.       /* フレーム数を求める */
  644.         int framenum;
  645.         framenum = list_getDataNum(swin[1].plImage);
  646.         if (framenum <= 0)
  647.         {
  648.             dispAlertMessage(alertTitle, "動画倉庫に画像が1つもないので、"
  649.                             "動画ファイルが作成できません");
  650.             return -1;
  651.         }
  652.       /* 画像の縦・横の大きさ、画像一枚のバイト数を求める */
  653.         list_top(swin[1].plImage);
  654.         SIMAGE *psi;
  655.         SIMAGELISTgetData(swin[1].plImage, &psi);
  656.         int width,height,frameSize;
  657.         width  = psi->piOriginal->width;
  658.         height = psi->piOriginal->height;
  659.         frameSize = width * height * 2;
  660.         if (frameSize == 0)
  661.         {
  662.             dispAlertMessage(alertTitle, "動画倉庫に登録されている画像が"
  663.                              "小さすぎるので、動画ファイルが作成できません");
  664.             return -1;
  665.         }
  666.       /* ファイルのオープン、メインヘッダの書き出し */
  667.         if ((fp = fopen(fname, "wb")) == NULL)
  668.             return -1;
  669.         MOV_MAINHEAD head;
  670.         MOV_MAINHEAD_init(&head);
  671.         head.dataSize = (sizeof(MOV_FRAMEHEAD) + frameSize) * framenum;
  672.         head.frameNum = framenum;
  673.         head.dispx0 = 0;
  674.         head.dispy0 = 0;
  675.         head.dispx1 = width;
  676.         head.dispy1 = height;
  677.         head.wait = 5;
  678.         fwrite(&head, sizeof(head), 1, fp);
  679.         // printf("MAINHEAD = %d\n", sizeof(head));
  680.       /* 各フレームの書き出し */
  681.         for (i=0; i<framenum; i++)
  682.         {
  683.             list_moveTo(swin[1].plImage, i);
  684.             SIMAGELISTgetData(swin[1].plImage, &psi);
  685.             IMAGE *pi;
  686.             pi = psi->piOriginal;
  687.             if (width != pi->width || height != pi->height)
  688.             {
  689.                 dispAlertMessage(alertTitle,
  690.                     "動画倉庫に、サイズが異なる画像が入っているので、"
  691.                     "MOVファイルが作成できません");
  692.                 break;
  693.             }
  694.             MOV_FRAMEHEAD frhead;
  695.             memset(&frhead, 0, sizeof(MOV_FRAMEHEAD));
  696.             frhead.page = i;
  697.             frhead.dataSize = frameSize; 
  698.             fwrite(&frhead,sizeof(frhead),1,fp);
  699.             fwrite(pi->image,1,frameSize,fp);
  700.             // printf("FRAMEHEAD = %d\n", sizeof(frhead));
  701.         }
  702.         fclose(fp);
  703.         return 0;
  704. #else
  705.         static char alertTitle[] = "V00 ファイルの作成";
  706.         FILE *fp;
  707.         int i;
  708.       /* フレーム数を求める */
  709.         int framenum;
  710.         framenum = list_getDataNum(swin[1].plImage);
  711.         if (framenum <= 0)
  712.         {
  713.             dispAlertMessage(alertTitle, "動画倉庫に画像が1つもないので、"
  714.                             "動画ファイルが作成できません");
  715.             return -1;
  716.         }
  717.       /* 画像の縦・横の大きさ、画像一枚のバイト数を求める */
  718.         list_top(swin[1].plImage);
  719.         SIMAGE *psi;
  720.         SIMAGELISTgetData(swin[1].plImage, &psi);
  721.         int width,height,frameSize;
  722.         width  = psi->piOriginal->width;
  723.         height = psi->piOriginal->height;
  724.         frameSize = width * height * 2;
  725.         if (frameSize == 0)
  726.         {
  727.             dispAlertMessage(alertTitle, "動画倉庫に登録されている画像が"
  728.                              "小さすぎるので、動画ファイルが作成できません");
  729.             return -1;
  730.         }
  731.       /* ファイルのオープン、メインヘッダの書き出し */
  732.         if ((fp = fopen(fname, "wb")) == NULL)
  733.             return -1;
  734.         V00_HEAD head;
  735.         V00_HEAD_init(&head);
  736.         head.dataSize = frameSize * framenum;
  737.         head.frameNum = framenum;
  738.         head.width = width;
  739.         head.height = height;
  740.         head.wait = 7;
  741.         fwrite(&head, sizeof(head), 1, fp);
  742.         // printf("MAINHEAD = %d\n", sizeof(head));
  743.       /* 各フレームの書き出し */
  744.         for (i=0; i<framenum; i++)
  745.         {
  746.             list_moveTo(swin[1].plImage, i);
  747.             SIMAGELISTgetData(swin[1].plImage, &psi);
  748.             IMAGE *pi;
  749.             pi = psi->piOriginal;
  750.             if (width != pi->width || height != pi->height)
  751.             {
  752.                 dispAlertMessage(alertTitle,
  753.                     "動画倉庫に、サイズが異なる画像が入っているので、"
  754.                     "MOVファイルが作成できません");
  755.                 break;
  756.             }
  757.             fwrite(pi->image,1,frameSize,fp);
  758.         }
  759.         fclose(fp);
  760.         return 0;
  761. #endif
  762.     }
  763.  
  764.  
  765.     void imstore_saveFrameStoreAsMovieFile(void)
  766.     {
  767.         static char alertTitle[] = "動画ファイル保存(動画倉庫)";
  768.         int ret;
  769.         int fileNum,i;
  770.         char pathbuf[100]; int fileAtr;
  771.         if (list_getDataNum(swin[1].plImage) <= 0)
  772.         {
  773.             dispAlertMessage(alertTitle, "動画倉庫に画像が1つもないので、"
  774.                             "動画ファイルが作成できません");
  775.             return;
  776.         }
  777.         ret = RM_callSimpleFDG(idDesktopAlertHyper, idDesktopSelectiveHyper,
  778.                                "V00 保存", "保存", "取消", "*.V00",
  779.                                FDG_FILEONLY|FDG_TEXT, pathbuf);
  780.         if (ret != 0)
  781.             return;    // 「取消」
  782.         char pathbuf2[100];
  783.         strcpy(pathbuf2,pathbuf);
  784.         trans_fname_ext(pathbuf, pathbuf2, "V00");
  785.         if (fexist(pathbuf))
  786.         {
  787.             char strbuf[200];
  788.             sprintf(strbuf, "ファイル %s がすでに存在しています。"
  789.                     "上書きしますか?", pathbuf);
  790.             if (dispCheckMessage(alertTitle, strbuf, "上書き") != 0)
  791.                 return;
  792.         }
  793.         int moscsr;
  794.         MG_PushPtr(MOSICON_WAIT, &moscsr);
  795.         imstore_saveFrameStore_MOV(pathbuf);
  796.         MG_PopPtr(moscsr);
  797.     }
  798.  
  799.     int imstore_checkSaveFrameStore(void)
  800.     {
  801.         if (list_getDataNum(swin[1].plImage) <= 0)
  802.             return -1;
  803.         else
  804.             return 0;
  805.     }
  806.  
  807.     void imstore_saveFrameStore(void)
  808.     {
  809.         static char alertTitle[] = "動画倉庫を番号付けでTIFF化";
  810.         int ret;
  811.         int fileNum,i;
  812.         char pathbuf[100]; int fileAtr;
  813.         if (list_getDataNum(swin[1].plImage) <= 0)
  814.         {
  815.             dispAlertMessage(alertTitle, "動画倉庫に画像が1つもないので、"
  816.                              "TIFF化することができません");
  817.             return;
  818.         }
  819.         ret = RM_callSimpleFDG(idDesktopAlertHyper, idDesktopSelectiveHyper,
  820.                                "動画倉庫TIFF化", "保存", "取消", "*.TIF",
  821.                                FDG_FILEONLY|FDG_TEXT, pathbuf);
  822.         if (ret != 0)
  823.             return;    // 「取消」
  824.         char    drive[_MAX_DRIVE+2],dir[_MAX_DIR+2],basename[_MAX_FNAME+2],
  825.                 ext[_MAX_EXT+2];
  826.         _splitpath(pathbuf, drive, dir, basename, ext);
  827.         SIMAGE *si;
  828.         int framenum = list_getDataNum(swin[1].plImage);
  829.         for (i=0; i<framenum; i++)
  830.         {
  831.             list_moveTo(swin[1].plImage, i);
  832.             SIMAGELISTgetData(swin[1].plImage, &si);
  833.             if (si->piOriginal == NULL)
  834.                 continue;
  835.             char buf1[_MAX_FNAME+2],buf2[20];
  836.             strncpy(buf1, basename, 5);
  837.             sprintf(buf2, "%s%03d", buf1, i);
  838.             _makepath(pathbuf, drive, dir, buf2, "TIF");
  839.             if (fexist(pathbuf))
  840.             {
  841.                 char strbuf[200];
  842.                 sprintf(strbuf, "ファイル %s がすでに存在しています。"
  843.                         "上書きしますか?", pathbuf);
  844.                 if (dispCheckMessage(alertTitle, strbuf, "上書き") != 0)
  845.                     continue;
  846.             }
  847.             int ret;
  848.             int moscsr;
  849.             MG_PushPtr(MOSICON_WAIT, &moscsr);
  850.             ret = image_saveTIFF(si->piOriginal, pathbuf);
  851.             MG_PopPtr(moscsr);
  852.             if (ret != 0)
  853.             {
  854.                 char strbuf[200];
  855.                 makeErrorMessage(strbuf, pathbuf, ret);
  856.                 dispAlertMessage(alertTitle, strbuf);
  857.                 break;
  858.             }
  859.         }
  860.     }
  861.  
  862. /*--------------------------------------------------------*/
  863. /*                  倉庫への画像のロード                  */
  864. /*--------------------------------------------------------*/
  865.  
  866.     void imstore_loadToStore(int side)
  867.     {
  868.         static char alertTitle[] = "倉庫へ画像を読込";
  869.         int ret;
  870.         int fileNum,i;
  871.         char pathbuf[100]; int fileAtr;
  872.         ret = RM_callSimpleFDG(idDesktopAlertHyper, idDesktopSelectiveHyper,
  873.                                (side==0 ? "静止画倉庫読込" : "動画倉庫読込"),
  874.                                "読込", "取消", "*.TIF",
  875.                                FDG_FILEONLY|FDG_MSLCT, pathbuf);
  876.         if (ret != 0)
  877.             return;    // 「取消」
  878.         fileNum = *(int*)pathbuf;
  879.         for (i=0; i<fileNum; i++)
  880.         {
  881.             int ret;
  882.             IMAGE *pi;
  883.             FDG_GetPathName(pathbuf, &fileAtr, i);
  884.             int moscsr;
  885.             MG_PushPtr(MOSICON_WAIT, &moscsr);
  886.             ret = image_createloadTIFF(&pi, pathbuf);
  887.             MG_PopPtr(moscsr);
  888.             if (ret != 0)
  889.             {
  890.                 static char str[200];
  891.                 sprintf(str, "ファイル %s ", pathbuf);
  892.                 if (ret == ERROR_CANNOTOPEN)
  893.                 {
  894.                     strcat(str,"が見つかりません");
  895.                     dispAlertMessage(alertTitle,str);
  896.                 }
  897.                 else if (ret == ERROR_INVALIDFORMAT)
  898.                 {
  899.                     strcat(str,    "は TOWNS 標準 TIFF 形式でないので"
  900.                                 "読み込めません");
  901.                     dispAlertMessage(alertTitle,str);
  902.                 }
  903.                 else if (ret == ERROR_INVALIDPIXELSIZE)
  904.                 {
  905.                     strcat(str,    "は3万色画像ではないので"
  906.                                 "読み込めません");
  907.                     dispAlertMessage(alertTitle,str);
  908.                 }
  909.                 else
  910.                 {
  911.                     alert_noMemory(alertTitle);
  912.                     break;
  913.                 }
  914.                 continue;
  915.             }
  916.             if (imstore_storeNewImage(side, pi, -1) != 0)
  917.             {
  918.                 alert_noMemory(alertTitle);
  919.                 break;
  920.             }
  921.         }
  922.     }
  923.  
  924. /*--------------------------------------------------------*/
  925. /*                 1枚のマーク画像を保存                 */
  926. /*--------------------------------------------------------*/
  927.  
  928.     int    imstore_checkSaveMarkedImage(void)
  929.     {
  930.         int flag[2];
  931.         flag[0] = flag[1] = FALSE;
  932.         if (0 <= swin[0].nMarkedImage &&
  933.             swin[0].nMarkedImage < list_getDataNum(swin[0].plImage))
  934.             flag[0] = TRUE;
  935.         if (0 <= swin[1].nMarkedImage &&
  936.             swin[1].nMarkedImage < list_getDataNum(swin[1].plImage))
  937.             flag[1] = TRUE;
  938.         if (flag[0]==TRUE && flag[1]==TRUE)
  939.             return -1;
  940.         if (flag[0] == FALSE && flag[1] == FALSE)
  941.             return -1;
  942.         return 0;
  943.     }
  944.  
  945.     void imstore_saveMarkedImage(void)
  946.     {
  947.         static char alertTitle[] = "マーク画像を保存";
  948.         int ret;
  949.         int fileNum,i;
  950.         char pathbuf[100]; int fileAtr;
  951.         int flag[2];
  952.         SIMAGE *psi;
  953.       /* どの画像を保存するのかを決める */
  954.         flag[0] = flag[1] = FALSE;
  955.         if (0 <= swin[0].nMarkedImage && swin[0].nMarkedImage < list_getDataNum(swin[0].plImage))
  956.             flag[0] = TRUE;
  957.         if (0 <= swin[1].nMarkedImage && swin[1].nMarkedImage < list_getDataNum(swin[1].plImage))
  958.             flag[1] = TRUE;
  959.         if (flag[0]==TRUE && flag[1]==TRUE)
  960.         {
  961.             dispAlertMessage(alertTitle, "静止画倉庫、動画倉庫の両方で"
  962.                                 "画像がマークされているので保存できません"
  963.                                 "(どちらか一方のマークを解除してください)");
  964.             return;
  965.         }
  966.         if (flag[0] == FALSE && flag[1] == FALSE)
  967.         {
  968.             dispAlertMessage(alertTitle, "静止画倉庫、動画倉庫どちらでも"
  969.                                 "画像がマークされていないので、"
  970.                                 "画像が保存できません");
  971.             return;
  972.         }
  973.         LIST *pli;
  974.         int idx;
  975.         if (flag[0])
  976.             pli = swin[0].plImage, idx = swin[0].nMarkedImage;
  977.         else
  978.             pli = swin[1].plImage, idx = swin[1].nMarkedImage;
  979.         list_moveTo(pli,idx);
  980.         SIMAGELISTgetData(pli, &psi);
  981.         IMAGE *pi;
  982.         pi = psi->piOriginal;
  983.       /* ファイルダイアログを呼び出してファイル名を取得 */
  984.         ret = RM_callSimpleFDG(idDesktopAlertHyper, idDesktopSelectiveHyper,
  985.                                "マーク画像保存", "保存", "取消", "*.TIF",
  986.                                FDG_FILEONLY|FDG_TEXT, pathbuf);
  987.         if (ret != 0)
  988.             return;    // 「取消」
  989.       /* 保存 */
  990.         char pathbuf2[100];
  991.         strcpy(pathbuf2,pathbuf);
  992.         trans_fname_ext(pathbuf, pathbuf2, "TIF");
  993.         if (fexist(pathbuf))
  994.         {
  995.             char strbuf[200];
  996.             sprintf(strbuf, "ファイル %s がすでに存在しています。"
  997.                     "上書きしますか?", pathbuf);
  998.             if (dispCheckMessage(alertTitle, strbuf, "上書き") != 0)
  999.                 return;
  1000.         }
  1001.         int moscsr;
  1002.         MG_PushPtr(MOSICON_WAIT, &moscsr);
  1003.         ret = image_saveTIFF(pi, pathbuf);
  1004.         MG_PopPtr(moscsr);
  1005.         if (ret != 0)
  1006.         {
  1007.             char strbuf[200];
  1008.             makeErrorMessage(strbuf, pathbuf, ret);
  1009.             dispAlertMessage(alertTitle, strbuf);
  1010.         }
  1011.     }
  1012.  
  1013. /*--------------------------------------------------------*/
  1014. /*                   部品の呼び出し関数                   */
  1015. /*--------------------------------------------------------*/
  1016.  
  1017.     #define SET_MOSCSR(type)        \
  1018.         MG_mosDisp(2);                \
  1019.         MG_PushPtr(type, &moscsr);    \
  1020.         MG_mosDisp(3);
  1021.     #define RECOVER_MOSCSR            \
  1022.         MG_mosDisp(2);                \
  1023.         MG_PopPtr(moscsr);            \
  1024.         MG_mosDisp(3);
  1025.  
  1026.     static void imstore_WinUserMouseOn(int side, LIST *pli, EVENT *pev)
  1027.     /* 静止画倉庫,動画倉庫のユーザー領域でマウスクリックされたときの処理 */
  1028.     {
  1029.         static char alertTitle[] = "倉庫の画像の移動・複製";
  1030.         int msx,msy,t,n;
  1031.         FRAME fr;
  1032.         msx = ((POINT*)&pev->info)->x;
  1033.         msy = ((POINT*)&pev->info)->y;
  1034.         imstore_whichImage(msx,msy, &t,&n, &fr);
  1035.         if (t == side && n >= 0)
  1036.         {
  1037.             int moscsr;
  1038.             EVENT *pev;
  1039.             SET_MOSCSR(MOSICON_FINGER)
  1040.           /* その場でボタンが放されるか、あるいはドラッグされるかの判断*/
  1041.             do {
  1042.               do {
  1043.                 MMI_iosense() ;
  1044.               } while ((MMI_GetEvnt(EVMOSDRAG|EVMOSUP, &pev)) < NOERR);
  1045.             } while ((pev->shift & SLEFTBTN)==0);
  1046.             RECOVER_MOSCSR
  1047.           /* ドラッグされた場合、画像そのものを移動 */
  1048.             if (pev->what == EVMOSDRAG && n < list_getDataNum(pli))
  1049.             {
  1050.                 SET_MOSCSR(MOSICON_DRAG)
  1051.                 RM_setClipVisibleAllScr();
  1052.                 RM_setOriginZero();
  1053.                 MG_DragFrame(&fr, pev);
  1054.                 RECOVER_MOSCSR
  1055.                 int win,picn;
  1056.                 imstore_whichImage((fr.lupx+fr.rdwx)/2,(fr.lupy+fr.rdwy)/2,
  1057.                                    &win, &picn, NULL);
  1058.                 if (win >= 0)
  1059.                 {
  1060.                     int counterSide = (side == 0 ? 1 : 0);
  1061.                     if (win == counterSide)
  1062.                     {
  1063.                         SIMAGE *si;
  1064.                         IMAGE *piNew;
  1065.                         list_moveTo(pli, n);
  1066.                         SIMAGELISTgetData(pli, &si);
  1067.                         if ((piNew = image_copy(si->piOriginal)) == NULL)
  1068.                             alert_noMemory(alertTitle);
  1069.                         else
  1070.                         {
  1071.                             if (imstore_storeNewImage
  1072.                                   (counterSide, piNew, (picn >= 0 ? picn : -1))
  1073.                                 != 0)
  1074.                                 alert_noMemory(alertTitle);
  1075.                         }
  1076.                     }
  1077.                 }
  1078.                 else
  1079.                 {
  1080.                     int side,f;
  1081.                     points_whereis((fr.lupx+fr.rdwx)/2, (fr.lupy+fr.rdwy)/2,
  1082.                                    &side, &f);
  1083.                     //printf("imstore_WinUserMouseOn: (side,f,n,listNum)="
  1084.                     //        "%d,%d,%d,%d\n",
  1085.                     //        side,f,n, list_getDataNum(pli));
  1086.                     if (side >= 0)
  1087.                     {
  1088.                         SIMAGE *si;
  1089.                         IMAGE *piNew;
  1090.                         list_moveTo(pli, n);
  1091.                         SIMAGELISTgetData(pli, &si);
  1092.                         if ((piNew = image_copy(si->piOriginal)) == NULL)
  1093.                             alert_noMemory(alertTitle);
  1094.                         else
  1095.                             points_storeImage(side, piNew);
  1096.                     }
  1097.                 }
  1098.                 RM_recoverOrigin();
  1099.                 RM_recoverClipVisible();
  1100.             }
  1101.           /* その場でボタンが放された場合、マーク指定 */
  1102.             else if (pev->what == EVMOSUP)
  1103.             {
  1104.                 if (swin[side].nMarkedImage != n)
  1105.                     swin[side].nMarkedImage = n;
  1106.                 else
  1107.                     swin[side].nMarkedImage = -1;
  1108.             }
  1109.         }
  1110.         desktop_checkActivity();
  1111.     }
  1112.  
  1113.     /*    initDataZIMSTORE:idImageStoreWin[0]:MJ_WINDOWL40の呼び出し関数    */
  1114.     /*    initDataZIMSTORE:idImageStoreWin[1]:MJ_WINDOWL40の呼び出し関数    */
  1115.     int    ImageStoreWinFunc(kobj, messId, argc, pev, trigger)
  1116.     int        kobj ;
  1117.     int        messId ;
  1118.     int        argc ;
  1119.     EVENT    *pev ;
  1120.     int        trigger ;
  1121.     {
  1122.         int side;
  1123.         if (kobj == idImageStoreWin[0])
  1124.             side = 0;
  1125.         else
  1126.             side = 1;
  1127.         if (messId == MM_SHOW)
  1128.             dispImageList(&swin[side]);
  1129.         else if (messId == MM_UPDATE)
  1130.         {
  1131.             AdjustImageStoreWin(side);
  1132.             setSBarImageList(&swin[side], TRUE);
  1133.         }
  1134.         else if (messId == MM_MOVE)
  1135.         {
  1136.             RM_roundFramePosition(swin[side].idWin, 2,2);
  1137.             dispImageList(&swin[side]);
  1138.         }
  1139.         else if (messId == MM_MOUSEON)
  1140.         {
  1141.             imstore_WinUserMouseOn(side, swin[side].plImage, pev);
  1142.             dispImageList(&swin[side]);
  1143.             // printf("ImageStoreWinFunc: %d %d\n",t,n);
  1144.         }
  1145.         return NOERR ;
  1146.     }
  1147.  
  1148.     /*    initDataZIMSTORE:idImageStoreSBarV[0]:MJ_SCRLL40の呼び出し関数    */
  1149.     /*    initDataZIMSTORE:idImageStoreSBarV[1]:MJ_SCRLL40の呼び出し関数    */
  1150.     int    ImageStoreSBarFunc(kobj, messId, argc, pev, trigger)
  1151.     int        kobj ;
  1152.     int        messId ;
  1153.     int        argc ;
  1154.     EVENT    *pev ;
  1155.     int        trigger ;
  1156.     {
  1157.         int side;
  1158.         if (kobj == idImageStoreSBarV[0])
  1159.             side = 0;
  1160.         else
  1161.             side = 1;
  1162.     #if 0
  1163.         MG_mosDisp(2);
  1164.         int pos;
  1165.         pos = RM_getScrollPos(kobj) * 2;
  1166.         FRAME fr;
  1167.         RM_getWinUserFrame(swin[side].idWin, &fr);
  1168.         WIN_scrollWindow(swin[side].idWin, &fr, 0, swin[side].ofsY-pos);
  1169.         swin[side].ofsY = pos;
  1170.         dispImageList_onlyBack(&swin[side]);
  1171.         MG_mosDisp(3);
  1172.     #else
  1173.         dispImageList(&swin[side]);
  1174.     #endif
  1175.         return NOERR ;
  1176.     }
  1177.  
  1178.     /*    initDataZIMSTORE:idImageStoreEditDBtn[0][0]:MJ_DBUTTONL40    */
  1179.     /*    initDataZIMSTORE:idImageStoreEditDBtn[0][1]:MJ_DBUTTONL40    */
  1180.     /*    initDataZIMSTORE:idImageStoreEditDBtn[0][2]:MJ_DBUTTONL40    */
  1181.     /*    initDataZIMSTORE:idImageStoreEditDBtn[1][0]:MJ_DBUTTONL40    */
  1182.     /*    initDataZIMSTORE:idImageStoreEditDBtn[1][1]:MJ_DBUTTONL40    */
  1183.     /*    initDataZIMSTORE:idImageStoreEditDBtn[1][2]:MJ_DBUTTONL40    */
  1184.     int    ImageStoreEditDBtnFunc(kobj, messId, argc, pev, trigger)
  1185.     int        kobj ;
  1186.     int        messId ;
  1187.     int        argc ;
  1188.     EVENT    *pev ;
  1189.     int        trigger ;
  1190.     {
  1191.         int side,i;
  1192.         side = 0;
  1193.         for (i=0; i<3; i++)
  1194.             if (kobj == idImageStoreEditDBtn[1][i])
  1195.                 side = 1;
  1196.         int datnum = list_getDataNum(swin[side].plImage);
  1197.         int mark = swin[side].nMarkedImage;
  1198.         if (kobj == idImageStoreEditDBtn[side][0] ||
  1199.             kobj == idImageStoreEditDBtn[side][1])
  1200.         {
  1201.             static char *alertTitle;
  1202.             if (side == 0)
  1203.                 alertTitle = "静止画倉庫の画像を cut / copy";
  1204.             else
  1205.                 alertTitle = "動画倉庫の画像を cut / copy";
  1206.             if (0 <= mark && mark < datnum)
  1207.             {
  1208.                 SIMAGE *psi;
  1209.                 IMAGE *pi;
  1210.                 list_moveTo(swin[side].plImage, mark);
  1211.                 SIMAGELISTgetData(swin[side].plImage, &psi);
  1212.                 if ((pi = image_copy(psi->piOriginal)) != NULL)
  1213.                 {
  1214.                     if (kobj == idImageStoreEditDBtn[side][0])
  1215.                         imstore_deleteImage(side, mark);
  1216.                     if (piPaste != NULL)
  1217.                         image_delete(piPaste);
  1218.                     piPaste = pi;
  1219.                 }
  1220.                 else
  1221.                     alert_noMemory(alertTitle);
  1222.             }
  1223.         }
  1224.         else if (kobj == idImageStoreEditDBtn[side][2])
  1225.         {
  1226.             static char *alertTitle;
  1227.             if (side == 0)
  1228.                 alertTitle = "静止画倉庫へ画像を paste";
  1229.             else
  1230.                 alertTitle = "動画倉庫へ画像を paste";
  1231.             if (piPaste != NULL)
  1232.             {
  1233.                 IMAGE *pi;
  1234.                 if ((pi = image_copy(piPaste)) != NULL)
  1235.                 {
  1236.                     if (imstore_storeNewImage(side,pi,(mark>=0? mark:-1)) != 0)
  1237.                         alert_noMemory(alertTitle);
  1238.                 }
  1239.                 else
  1240.                     alert_noMemory(alertTitle);
  1241.             }
  1242.         }
  1243.         desktop_checkActivity();
  1244.         return NOERR ;
  1245.     }
  1246.  
  1247.